package com.saa.dict.service;


import com.saa.common.utils.CommonUtil;
import com.saa.common.utils.Page;
import com.saa.common.vo.OmsResultVo;
import com.saa.dict.dao.SaaDictDao;
import com.saa.dict.dao.SaaRiskDao;
import com.saa.dict.po.SaaDict;
import com.saa.dict.po.SaaRisk;
import com.saa.dict.vo.DictDetail;
import com.saa.dict.vo.DictInfo;
import com.saa.dict.vo.SaaDictVo;
import com.saa.dict.vo.SaaRiskVo;
import ins.framework.utils.Beans;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class SaaDictService {
    public static final Logger logger = LoggerFactory.getLogger(SaaDictService.class);
    @Autowired
    private SaaDictDao saaDictDao;
    @Autowired
    private SaaRiskDao saaRiskDao;

    /****根据应用、类型、状态分页查询数据字典***/
    public OmsResultVo findSaaDictListByParams(Map<String,Object> paramMap) {
        int currPage = 1;
        int pageCount = 50;
        //页码
        currPage = (Integer) paramMap.get("pageNum");
        //页宽
        pageCount = (Integer) paramMap.get("pageSize");
        DictInfo dictInfo = new DictInfo();
        List<SaaDict> saaDictList = saaDictDao.selectDistByparmas(paramMap);
        List<SaaDictVo> saaDictVoList = new ArrayList<SaaDictVo>();
        if(!CommonUtil.isEmptyList(saaDictList)){
            saaDictVoList = saaDictList.stream().map(dict->{
                SaaDictVo dictVo = new SaaDictVo();
                Beans.copy().from(dict).to(dictVo);
                return dictVo;
            }).collect(Collectors.toList());
        }
        Page page = new Page<SaaDictVo>(pageCount,currPage,saaDictVoList);
        dictInfo.setDictInfoVos(page);
        return OmsResultVo.builder(200, "查询成功", dictInfo);
    }

    /****批量保存或修改数据字典信息***/
    public OmsResultVo saveSaaDictList(DictDetail dictDetail){
        List<SaaDictVo> saaDictVoList = dictDetail.dictVoList;
        List<SaaDict> dictList = new ArrayList<SaaDict>();
        if(!CommonUtil.isEmptyList(saaDictVoList)){
               dictList = saaDictVoList.stream().map(dictVo->{
               SaaDict saaDict = new SaaDict();
               Beans.copy().from(dictVo).to(saaDict);
               saaDict.setCodeType(dictDetail.getCodeType());
               saaDict.setTypeName(dictDetail.getTypeName());
               saaDict.setApplicationCode(dictDetail.getApplicationCode());
               saaDict.setDescription(dictDetail.getDescription());
               if("1".equals(dictDetail.getOperatorFlag())){//1-保存 0-修改
                   String dictId = CommonUtil.getUpperUuid();
                   saaDict.setDictId(dictId);
                   saaDict.setCreateTime(new Date());
               }else{
                   saaDict.setUpdateTime(new Date());
               }
               return saaDict;
           }).collect(Collectors.toList());
           if("1".equals(dictDetail.getOperatorFlag())){
               int res1 = saaDictDao.saveDictBatch(dictList);
               if(res1>0){
                   return OmsResultVo.builder(200, "保存成功", null);
               }else {
                   return OmsResultVo.builder(500, "保存失败", null);
               }
           }else{
               int res2 = saaDictDao.updateDictBatch(dictList);
               if(res2>0){
                   return OmsResultVo.builder(200, "更新成功", null);
               }else {
                   return OmsResultVo.builder(500, "更新失败", null);
               }
           }
        }
        return null;
    }

    /****根据数据字典ID查询数据**/
    public SaaDictVo getSaaDictVo(String id){
        SaaDictVo saaDictVo = new SaaDictVo();
        SaaDict saaDict= saaDictDao.selectByPrimaryKey(id);
        Beans.copy().from(saaDict).to(saaDictVo);
        return saaDictVo;
    }

    /****保存数据字典***/
    public OmsResultVo saveSaaDict(SaaDictVo saaDictVo){
        SaaDict saaDict = new SaaDict();
        String dictId = CommonUtil.getUpperUuid();
        saaDictVo.setDictId(dictId);
        saaDictVo.setCreateTime(new Date());
        Beans.copy().from(saaDictVo).to(saaDict);
        int res = saaDictDao.insertSelective(saaDict);
        if(res>0){
            return OmsResultVo.builder(200, "保存成功", null);
        }else {
            return OmsResultVo.builder(500, "保存失败", null);
        }
    }

    /****修改数据字典***/
    public OmsResultVo updateSaaDict(SaaDictVo saaDictVo){
        SaaDict saaDict = new SaaDict();
        saaDictVo.setUpdateTime(new Date());
        Beans.copy().from(saaDictVo).to(saaDict);
        int res = saaDictDao.updateByPrimaryKey(saaDict);
        if(res>0){
            return OmsResultVo.builder(200, "更新成功", null);
        }else {
            return OmsResultVo.builder(500, "更新失败", null);
        }
    }

    /****删除数据字典***/
   public OmsResultVo deleteDist(Map<String,Object> paramMap){
       String dictId = (String) paramMap.get("dictId");
       int res = saaDictDao.deleteByPrimaryKey(dictId);
       if(res>0){
           return OmsResultVo.builder(200, "删除成功", null);
       }else {
           return OmsResultVo.builder(500, "删除失败", null);
       }
   }

    /****根据应用、类型查询数据字典类型列表***/
    public OmsResultVo findDistsByConditon(Map<String,Object> paramMap){
        String codeType = (String) paramMap.get("codeType");
        String appCode = (String) paramMap.get("appCode");
        List<SaaDict> saaDicts = saaDictDao.selectDistsByConditon(appCode,codeType);
        List<SaaDictVo> saaDictVoList = new ArrayList<SaaDictVo>();
        if(CommonUtil.isEmptyList(saaDicts)){
            saaDictVoList = saaDicts.stream().map(dict->{
                SaaDictVo saaDictVo = new SaaDictVo();
                Beans.copy().from(dict).to(saaDictVo);
                return saaDictVo;
            }).collect(Collectors.toList());
        }
        return OmsResultVo.builder(200, "查询成功", saaDictVoList);
    }

    /****根据应用查询数据字典类型列表***/
    public OmsResultVo findDistInfoByAppCode (Map<String,Object> paramMap){
        String appCode = (String) paramMap.get("appCode");
        List<SaaDict> saaDicts = saaDictDao.selectDistsByAppCode(appCode);
        List<SaaDictVo> saaDictVoList = new ArrayList<SaaDictVo>();
        if(CommonUtil.isEmptyList(saaDicts)){
            saaDictVoList = saaDicts.stream().map(dict->{
                SaaDictVo saaDictVo = new SaaDictVo();
                Beans.copy().from(dict).to(saaDictVo);
                return saaDictVo;
            }).collect(Collectors.toList());
        }
        return OmsResultVo.builder(200, "查询成功", saaDictVoList);
    }

    /*****根据应用代码获取数据类型列表***/
    public List<SaaDictVo> getCodeType(List<SaaDictVo> saaDictVos){
        List<SaaDictVo> dictVos = new ArrayList<SaaDictVo>();
        List<String> applicationCodes = new ArrayList<String>();
        for(SaaDictVo saaDictVo :saaDictVos){
            applicationCodes.add(saaDictVo.getApplicationCode());
        }
        List<SaaDict> saaDicts = saaDictDao.selectCodeTypeAll(applicationCodes);
        for(SaaDict saaDict :saaDicts){
            SaaDictVo saaDictVo = new SaaDictVo();
            Beans.copy().from(saaDict).to(saaDictVo);
            dictVos.add(saaDictVo);
        }
        return dictVos;
    }

    /*****根据数据类型获取数据列表***/
    public List<SaaDictVo> getDistList(SaaDictVo saaDictVo){
        List<SaaDictVo> dictVos = new ArrayList<SaaDictVo>();
        Map<String, Object> params = new HashMap<>();
        params.put("codeType",saaDictVo.getCodeType());
        List<SaaDict> saaDicts = saaDictDao.selectDistByCodeType(params);
        for(SaaDict saaDict :saaDicts){
            SaaDictVo dictVo = new SaaDictVo();
            Beans.copy().from(saaDict).to(dictVo);
            dictVos.add(dictVo);
        }
        return dictVos;
    }

    /****查询所有保险产品数据列表***/
    public List<SaaRiskVo> getClassList() {
        List<SaaRiskVo> saaRiskVos = new ArrayList<SaaRiskVo>();
        List<SaaRisk> saaRisks = saaRiskDao.selectClassAll();
        for(SaaRisk saaRisk :saaRisks){
            SaaRiskVo saaRiskVo = new SaaRiskVo();
            Beans.copy().from(saaRisk).to(saaRiskVo);
            saaRiskVos.add(saaRiskVo);
        }
        return saaRiskVos;
    }

    /****查询保险产品数据列表***/
    public List<SaaRiskVo> getRiskList(SaaRiskVo saaRiskVo) {
        List<SaaRiskVo> saaRiskVos = new ArrayList<SaaRiskVo>();
        String classCode = saaRiskVo.getClassCode();
        Map<String, Object> params = new HashMap<>();
        params.put("classCode",classCode);
        List<SaaRisk> saaRisks = saaRiskDao.selectRiskByClassCode(params);
        for(SaaRisk saaRisk :saaRisks){
            SaaRiskVo riskVo = new SaaRiskVo();
            Beans.copy().from(saaRisk).to(riskVo);
            saaRiskVos.add(riskVo);
        }
        return saaRiskVos;
    }


}
